#include <my_header.h>

// 定义一个函数来简化对单个域名的查询和打印
void query_and_print_dns(const char *hostname) {
    struct addrinfo hints, *res;

    // 初始化 hints 结构体
    memset(&hints, 0, sizeof(hints));
    hints.ai_socktype = SOCK_STREAM; // TCP socket

    // 调用 getaddrinfo 查询域名
    int status;
    if ((status = getaddrinfo(hostname, NULL, &hints, &res)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
        return;
    }

    // 遍历结果链表并打印 IP 地址
    for (struct addrinfo *p = res; p != NULL; p = p->ai_next) {
        void *addr;
        char ipstr[INET_ADDRSTRLEN]; 

        // 根据地址族选择正确的 IP 字段
        if (p->ai_family == AF_INET) { // IPv4
            struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
            addr = &(ipv4->sin_addr);
            inet_ntop(p->ai_family, addr, ipstr, INET_ADDRSTRLEN);
            printf("IPv4, Hostname: %s, IP = %s\n", hostname, ipstr);
        } 
    }

    // 释放资源
    freeaddrinfo(res);
}

int main(int argc, char *argv[]) {
    // 定义要查询的域名列表
    const char *domains[] = {
        "jd.com",   // 京东
        "qq.com",   // 腾讯
        "baidu.com",// 百度
        "alibaba.com" // 阿里
    };
    int num_domains = sizeof(domains) / sizeof(domains[0]);

    // 对每个域名调用查询函数
    for (int i = 0; i < num_domains; i++) {
        query_and_print_dns(domains[i]);
    }

    return 0;
}
